#include "subidaEncosta.h"

bool ordena_lista_filhos(struct No filho1, struct No filho2)
{
	return (filho1.distancia > filho2.distancia) ? true : false;
}

SubidaEncosta::SubidaEncosta()
{
    this->mInicio = 0;
    this->mFim = 7;
    this->mGrafo = new MatrizAdjacencia();
    this->mGrafo->constroi();
}

SubidaEncosta::SubidaEncosta(int inicio, int fim)
{
    this->mInicio = inicio;
    this->mFim = fim;
    this->mGrafo = new MatrizAdjacencia();
    this->mGrafo->constroi();
}

void SubidaEncosta::retornaCaminho()
{	
    std::cout << "Subida de Encosta Caminho: ";
	
	struct No pai;
	pai.indice = this->mInicio;
	pai.distancia = this->mGrafo->getDistancia(this->mInicio);
    
	mPai.push_back(pai);

	while(!mPai.empty() && mPai.back().indice != this->mFim)
	{
		int* filhos = this->mGrafo->getFilhos(mPai.back().indice);
		std::cout << mPai.back().indice << " -> ";
		mPai.pop_back();
		mFilhos.clear();
		for(int i = 0; i < this->mGrafo->getNumVertices(); i++)
		{
			if(filhos[i] > 0)
			{
				struct No filho;
				filho.indice = i;
				filho.distancia = this->mGrafo->getDistancia(i);
				mFilhos.push_back(filho);
			}
		}
		mFilhos.sort(ordena_lista_filhos);
		mPai.splice(mPai.end(), mFilhos);
     }
    std::cout << this->mFim << std::endl;
}
